/*
 * NodoHoja.cpp
 */

#include "NodoHoja.h"

NodoHoja::NodoHoja() {

}

NodoHoja::~NodoHoja() {
}

int NodoHoja::guardarEnBloque(int tamBloque) {

	Bloque bloqueAux(tamBloque);
	int res = 0;

	Registro registro(Util::intToCharAst(numeroDeNodo));
	res = bloqueAux.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}

	registro.buffer = (Util::intToCharAst(nivel));
	res = bloqueAux.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}
	registro.buffer = (Util::intToCharAst(elementos.size()));
	res = bloqueAux.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}

	for (int i = 0; i < elementos.size(); i++) {
		registro.buffer = (Util::intToCharAst(elementos.at(i).clave));
		res = bloqueAux.agregarRegistro(registro);
		if (res == -1) {
			return res;
		}
		registro.buffer = (Util::stringToCharAst(elementos.at(i).valor));
		res = bloqueAux.agregarRegistro(registro);
		if (res == -1) {
			return res;
		}
	}

	registro.buffer = (Util::intToCharAst(proximoNodo));
	res = bloqueAux.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}

	//Si no hubo overflow se modifica el bloque
	this->bloque = bloqueAux;

	return 0;
}

int NodoHoja::leerDeBloque(Bloque elBloque) {
	//Si el nivel no es = 0 entonces no es un nodo hoja y devuelve -1;
	Registro * registro = elBloque.obtenerRegistro(2);
	//cout<<registro->buffer<<endl;
	int nivel = Util::stringToInt(registro->buffer);
	if (nivel == 0) {
		this->nivel = nivel;

		registro = elBloque.obtenerRegistro(1);
		int nroNodo = Util::stringToInt(registro->buffer);
		this->numeroDeNodo = nroNodo;

		registro = elBloque.obtenerRegistro(3);
		int cantElementos = Util::stringToInt(registro->buffer);
		this->cantidadDeElementos = cantElementos;

		this->elementos.clear();
		ElementoHoja elemento;
		for (int i = 4; i < (this->cantidadDeElementos * 2) + 4; i++) {
			registro = elBloque.obtenerRegistro(i);
			int clave = Util::stringToInt(registro->buffer);
			i++;
			registro = elBloque.obtenerRegistro(i);
			string valor = registro->buffer;
			elemento.clave = clave;
			elemento.valor = valor;
			this->elementos.push_back(elemento);
		}

		int posNodoSig = (this->cantidadDeElementos * 2) + 4;
		registro = elBloque.obtenerRegistro(posNodoSig);
		int nodoSig = Util::stringToInt(registro->buffer);
		this->proximoNodo = nodoSig;

	} else {
		return -1;
	}
}

bool NodoHoja::tieneClave(int clave) {
	bool resultado = false;

	for (int i = 0; i < elementos.size(); i++) {
		if (elementos.at(i).clave == clave) {
			return true;
		}
	}
	return resultado;
}
